import os
import json

# 获取文件的绝对路径，然后基于这个路径进行路径拼接
base_dir = os.path.dirname(os.path.abspath(__file__))
# print(f'base_dir-->{base_dir}')


class TransferData():
    def __init__(self):
        self.lables_dict = json.load(open(os.path.join(base_dir, '../data/labels.json'), 'r', encoding='utf-8'))
        # print(f'self.lables_dict-->{self.lables_dict}')
        # 原始数据路径
        self.origin_path = os.path.join(base_dir, '../data_origin')
        # 处理后的数据路径
        self.train_path = os.path.join(base_dir, '../data/train.txt')

    def transfer(self):
        with open(self.train_path, 'w', encoding='utf-8') as fw:  # 处理后的数据
            # 使用os.walk()来获取所有的原始数据文件
            for root, dirs, files in os.walk(self.origin_path):  # 路径、文件夹、文件
                # print(f'root-->{root}')
                # print(f'dirs-->{dirs}')
                # print(f'files-->{files}')
                for file in files:
                    # 原始数据文件路径
                    file_path = os.path.join(root, file)
                    # 只获取含 txtoriginal 的文件
                    if 'txtoriginal' in file_path:
                        # print(f'file_path-->{file_path}')
                        # 获取标注数据的路径
                        lable_file_path = file_path.replace('.txtoriginal', '')
                        # 处理标注数据，生成索引和标签的字典
                        lable_dict = self.read_label_text(lable_file_path)

                        # 读取原始数据，然后遍历，打上对应的标签
                        with open(file_path, 'r', encoding='utf-8') as fr:
                            content = fr.read().strip()
                            # 如果数据最后一位不是结束符号，则添加一个结束符号
                            if content[-1] not in ['。', '?', '!', '！', '？']:
                                content += '。'
                        for index, word in enumerate(content):
                            lable = lable_dict.get(index, 'O')  # 通过索引获取标签，如果没有，则返回O
                            final_str = word + '\t' + lable + '\n'
                            fw.write(final_str)

                        # raise Exception('不要怕，这是故意的报错')

    def read_label_text(self, file_path):
        lable_dict = {} # 定义空字典
        with open(file_path, 'r', encoding='utf-8') as fr:
            for line in fr: # 遍历每行数据
                line = line.strip()
                if line:
                    # print(f'line-->{line}')  # 右髋部	21	23	身体部位
                    # 获取索引和标签
                    line_list = line.split('\t')
                    # print(f'line_list-->{line_list}')  # ['右髋部', '21', '23', '身体部位']
                    # 获取列表中的值
                    start = line_list[1]
                    end = line_list[2]
                    # label = self.lables_dict[line_list[3]]
                    label = self.lables_dict.get(line_list[3])

                    # 使用range，生成索引和标签的对应关系
                    for i in range(int(start), int(end) + 1):
                        if i == int(start):
                            lable_dict[i] = 'B-' + label
                        else:
                            lable_dict[i] = 'I-' + label
                    # print(f'lable_dict-->{lable_dict}')
                    # raise Exception('不要怕，这是故意的报错')

            # print(f'lable_dict-->{lable_dict}')
            return lable_dict


if __name__ == '__main__':
    td = TransferData()
    td.transfer()